package Date.TimeDay08;

import java.time.Instant;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
import java.util.Date;


import org.junit.Test;

/**
 * 	用于演示Instant:相当于Date,秒+纳秒
 * 	Instant:
 * 		1.获取
 * 			1.1静态方法now()
 * 			1.2静态方法of() ----> Instant里面存储了秒+纳秒
 * 			1.3转换得来：date.toInstant()
 * 		2.get方法：获取里面的秒（比较多一些）、纳秒
 * 		3.计算
 * 			3.1增加：plus(amountToAdd, unit); //amountToAdd：增量    unit：单位
 * 			3.2减少:   minus(amountToSubtract, unit) // amountToSubtract：增量  unit：单位
 * 			3.3时间间隔：until(endExclusive, unit); // endExclusive:结束的时间，  unit：时间单位
 * 			增加减少间隔的注意点：单位的范围（纳秒、微秒、毫秒、秒、分钟、小时、天）
 * 		4.with(field, newValue) // filed:设定的字段    newValue:值
 * 		5.时间的比较
 * 			5.1compareTo
 * 			5.2isBefore
 * 			5.3equals
 * 			5.4isAfter
 * 		6.时间单位：ChronoUnit
 * 		7.常用的时间字段：ChronoField
 * @author Administrator
 *
 */
public class InstantDemo {

	/**
	 * 	获取
	 */
	@Test
	public void demo() {
		
//		Instant instant = new Instant(); // 构造方法私有，没法创建实例
		
		// 1.第一种now
		Instant instant = Instant.now();
		System.out.println(instant);
		
		// 2.第二种of
		Instant instant2 = Instant.ofEpochMilli(System.currentTimeMillis()); // 毫秒
		System.out.println(instant2);
		Instant instant3 = Instant.ofEpochSecond(System.currentTimeMillis()/1000); // 秒 
		System.out.println(instant3);
//		Instant.ofEpochSecond(epochSecond, nanoAdjustment); // epochSecond:秒   nanoAdjustment纳秒
		
		// 3.转换的形式
		Date date = new Date();
		Instant instant4 = date.toInstant();
		System.out.println(instant4);
	}
	
	/**
	 * 	get类方法
	 */
	@Test
	public void demo2() {
		Instant instant = Instant.now();
		
		// get
		System.out.println(System.currentTimeMillis()); // 毫秒
		// 秒
		long second = instant.getEpochSecond();
		System.out.println(second);
		// 获取纳秒
		int nano = instant.getNano();
		System.out.println(nano);
		
		/*
		 * ChronoField:时间常用的字段
		 * MICRO_OF_SECOND:微秒数 
		 * MILLI_OF_SECOND:毫秒数
		 * NANO_OF_SECOND:纳秒数
		 * INSTANT_SECONDS:秒  溢出错误
		 * 
		 * */ 
		int milli = instant.get(ChronoField.INSTANT_SECONDS); 
		System.out.println(milli);
		
	}
	
	/**
	 * 	计算：
	 * 		减少：instant.minus(amountToSubtract, unit)   
	 * 		增加：instant.plus(amountToAdd, unit)
	 * 		时间单位：ChronoUnit
	 * 	注意点：进行运算的时候最多能计算到天
	 */
	@Test
	public void demo3() {
		
		Instant instant = Instant.now();
		System.out.println(instant);
		
		// 向后
		Instant instant2 = instant.plusSeconds(300); // 往后几秒
		System.out.println(instant2);
		Instant instant3 = instant.plusNanos(300); // 往后几纳秒
		System.out.println(instant3);
//		instant.plusMillis(millisToAdd); //往后几毫秒
		
		/*
		 * 	重点ChronoUnit：时间单位
		 * 	只能支持到天，月等是不支持的
		 * */ 
		Instant instant4 = instant.plus(1, ChronoUnit.DAYS); // amountToAdd：增量  unit：往后指定单位，
		System.out.println(instant4);
		
		// 向前
//		instant.minusSeconds(secondsToSubtract);
//		instant.minusMillis(millisToSubtract);
//		instant.minusNanos(nanosToSubtract);
//		instant.minus(amountToSubtract, unit); // amountToSubtract：时间 ，unit：单位  按照单位往前
	}
	
	/**
	 * 	计算时间间隔：instant.until(endExclusive, unit); // endExclusive:结束的时间，  unit：时间单位
	 * 	注意点：进行运算的时候最多能计算到天
	 */
	@Test
	public void demo4() {
		// 当前时刻
		Instant instant = Instant.now();
		
		// 回退两个小时
		Instant before = instant.minus(2, ChronoUnit.HOURS);
		
		// 计算间隔
		// instant.until(endExclusive, unit); // endExclusive:结束的时间，  unit：时间单位
		long until = instant.until(before, ChronoUnit.MINUTES);
		System.out.println("时间间隔是：" + until + "分钟");
	}
	
	/**
	 * 	时间的比较
	 */
	@Test
	public void demo5() {
		Instant instant = Instant.now();
		Instant instant2 = Instant.now();
		Instant instant3 = instant.plusSeconds(5);
		
		// 相等
		boolean isRight = instant.equals(instant2);
		System.out.println("instant和instant2的时间是否相同" + isRight);
		// 之前
		boolean isBefore = instant.isBefore(instant3);
		System.out.println(isBefore);
		// 之后
		boolean isAfter = instant3.isAfter(instant);
		System.out.println(isAfter);
		// 复制一行：ctrl+alt+下
		// 移动一行：alt+上/下
		
		int result = instant.compareTo(instant3); // -1 错误  0相等 1正确
		System.out.println(result);
	}
	
	/**
	 * 	设置指定的时刻：instant.with(field, newValue)
	 * 	注意事项：指定的时候只能指定：秒  毫秒  微秒 纳秒
	 */
	@Test
	public void demo6() {
		Instant instant = Instant.now();
		System.out.println(instant);
		/*
		 *	指定的时候只能指定：秒  毫秒  微秒 纳秒
		 * */ 
		Instant instant2 = instant.with(ChronoField.MILLI_OF_SECOND, 0); // filed:调节的单位,   newValue:值
		System.out.println(instant2);
	}
	
}